-
-
Notifications
You must be signed in to change notification settings - Fork 225
QOL: Allow finishing spans and transactions with using
#4627
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: version6
Are you sure you want to change the base?
Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## version6 #4627 +/- ##
===========================================
Coverage ? 73.08%
===========================================
Files ? 479
Lines ? 17389
Branches ? 3431
===========================================
Hits ? 12709
Misses ? 3821
Partials ? 859 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
@Flash0ver I'm trying to force an analyzer warning for the <WarningsAsErrors>CA2000</WarningsAsErrors> However I can't seem to get it to work: The warning does appear for the undisposed use of Any ideas/thoughts? |
Oh ... perhaps I totally misunderstood CA2000 😟 DisposeObjectsBeforeLosingScope.cs Hmmm ... it seems that the CA2000-DiagnosticAnalyzer does some Control-Flow-Analysis, that either tries to "see through" the implementation and does not report when it can't statically figure it out, or just does not report for some usage patterns. var instance1 = new MyDisposable(); //CA2000
var instance2 = new MyFactory().CreateInstance(); //CA2000
var instance3 = MyFactory.CreateStatic(); //CA2000
var instance4 = MyFactory.Instance.CreateInstance(); // does not report CA2000
public sealed class MyDisposable : IDisposable
{
public void Dispose()
{
}
}
public interface IMyFactory
{
IDisposable CreateInstance();
}
public sealed class MyFactory : IMyFactory
{
public static IMyFactory Instance { get; } = new MyFactory();
public static IDisposable CreateStatic() => new MyDisposable();
public IDisposable CreateInstance() => new MyDisposable();
} Not sure if that analysis behavior is intended or not. Now, as a follow-up, I'm wondering: var transaction = new TransactionTracer(null!, null!); //CA2000
var span = new SpanTracer(null!, transaction, default, default, null!); //CA2000
span.Finish();
transaction.Finish(); Are there valid/intended usage scenarios to instantiate these types directly from user code, which would report |
I can't think of any scenario in which people would want to construct those manually... so I suspect not.
That's possibly the case yes... and without being able to reproduce the warning that it's supposed to suppress, it's relatively difficult to test. I think this PR might be ready for review then... |
/// Transaction span tracer. | ||
/// </summary> | ||
public class SpanTracer : IBaseTracer, ISpan | ||
public sealed class SpanTracer : IBaseTracer, ISpan |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
question: Is it worth a consideration to make SpanTracer
internal, too? (in a potential follow-up)
So that users cannot run into CA2000
var span = new SpanTracer(null!, transaction, default, default, null!); //CA2000
span.Finish();
Or is it a potential user code scenario to try to cast?
if (SentrySdk.StartSpan("operation", "description") is SpanTracer span)
But this could have quite a large impact.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah I'm not sure if people are trying to cast these.
I think for the time being we should leave it as is. Eventually the plan is to get rid of transactions and, at that point, there's probably less need to cast from ISpan so we could re-evaluate.
/// <inheritdoc /> | ||
public void Finish() | ||
{ | ||
// TODO: Replace with InterlockedBoolean once this has been merged into version6 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TODO (as a "resolvable" comment)
Resolves #4321